<?php
//1.定义命名空间与本文件所在目录层级相同（app\home\controller）
//2.因为composer自动载入类的需要
//3.命名空间namespace之前不能有输出！
namespace app\admin\controller;

//1.引入扩展模型中Grade类
//2.用于本文件所定义的Student类调用add添加学生时需要选择相应的班级名称使用
use system\model\Grade;

//1.引入扩展模型中Student类
//2，用于去框架核心目录中的Base类（经过Model）执行其中操作数据库的方法
//3.起别名因为所引入的类的名称与该文件所定义的类名一致
use system\model\Student as StudentModel;

//1.引入框架核心目录中的View类
//2.用于载入模板文件及向模板文件传递数据
use houdunwang\view\View;

//1.定义Student类用于班级student表的增删改查操作
//2.继承Common类用于判断用户是否已经登录了
//如果没有登录则需要登录才能操作
class Student extends Common{

    //定义显示学生表数据的方法
    public function lists(){

        //1.调用框架核心类（Base）中的getJoinTable方法
        //2.查询两张表（student及grade表关联）的数据
        //3.用于向模板文件调用学生信息及其所在班级的名称
        $data = StudentModel::getJoinTable("student","grade");
        return View::make()->with(compact("data"));
    }

    //定义添加学生的方法
    public function add(){

        if(IS_POST){

            //1.如果用户上传了学生的头像
            //2.则调用第三方库的上传类方法
            //（返回结果一个上传后的头像图片的路径）
            if($_FILES["profileUpload"]['name']){
                $fileName = $this->upload();//php的fileinfo扩展要开启
            }else{
                //1.如果用户选择了”显示素材"中的图片则获取所选择图片的路径
                //2.（通过页面当中的隐藏域存储所选择图片的路径值）
                $fileName = $_POST["avator"];
            }
            //获取所上传/选择图片的时间
            $createtime = time();

            //将头像图片的路径值及上传/选择图片的时间存到附件表attachment中
            $attachmentData = "path='{$fileName}',createtime='{$createtime}'";
            \system\model\Attachment::insert($attachmentData);

            //1.定义要插入新的学生的数据（名称、性别、头像等）
            //2.调用框架核心Base类中插入insert方法向student表插入一条新的数据
            $newData = "sname='{$_POST['sname']}',sex='{$_POST['sex']}',profile='{$fileName}',introduction='{$_POST['introduction']}',birthday='{$_POST['birthday']}',gid={$_POST['gid']}";
            StudentModel::insert($newData);

            //添加成功后消息提示并返回学生列表页
            $this->setRedirect(u('lists'))->message("添加成功");
        }

        //1.获取班级表的数据
        //2.传递给模板文件用于添加时的下拉选择相应的班级
        $gradeData = Grade::get();
        return View::make()->with(compact("gradeData"));
    }


    //定义删除学生的方法
    public function remove(){
        //获取要删除的学生的序号（student表的主键值）
        $pri = $_GET["sid"];
        //调用框架核心Base类中删除delete方法删除指定主键值的数据
        StudentModel::delete($pri);
        //成功后消息提示并返回学生列表页
        $this->message("删除成功");
    }

    //定义修改学生信息的方法
    public function modify(){
        //获取要修改的学生的序号（student表的主键值）
        $pri = $_GET['sid'];
        //获取两张表（student及grade关联，以所要修改的学生数据的主键为限制条件）的数据
        //用于传递模板文件（修改页面）在其中调用显示修改前的数据
        $data = current(StudentModel::where("sid=$pri")->getJoinTable("student","grade"));

        if(IS_POST){
            //1.如果用户上传了学生的头像
            //2.则调用第三方库的上传类方法
            //（返回结果一个上传后的头像图片的路径）
            if($_FILES["profileUpload"]['name']){
                $fileName = $this->upload();//php的fileinfo扩展要开启
            }else{
                //1.如果用户选择了”显示素材"中的图片则获取所选择图片的路径
                //2.（通过页面当中的隐藏域存储所选择图片的路径值）
                $fileName = $_POST['avator'];
            }

            //1.定义要新的学生的数据（名称、性别、头像等）
            //2.调用框架核心Base类中修改update方法将指定的主键值的学生数据修改成新的数据
            $newData = "sname='{$_POST['sname']}',sex='{$_POST['sex']}',profile='{$fileName}',introduction='{$_POST['introduction']}',birthday='{$_POST['birthday']}',gid={$_POST['gid']}";
            StudentModel::update($pri,$newData);

            //修改成功后消息提示并返回学生列表页
            $this->setRedirect(u('lists'))->message("修改成功");
        }

        //1.获取班级表的数据
        //2.用于在修改时从全部班级中选择其中一个班级
        $gradeData = Grade::get();

        //1.载入模板文件（修改页面）
        //2.传递修改前的数据及班级表的数据在模板文件中调用显示
        return View::make()->with(compact("data","gradeData"));
    }




    //1.第三类库：上传类的方法
    //2.用于学生图片的上传操作
    private function upload() {
        //定义图片的保存目录
        $dir = './attachment/' . date( 'ymd' );
        //若目录不存在则创建
        is_dir( $dir ) || mkdir( $dir, 0755, true );
        $storage = new \Upload\Storage\FileSystem( $dir );
        //profileUpload与页面当中的上传控件的name值要相同
        $file    = new \Upload\File( 'profileUpload', $storage );

        // Optionally you can rename the file on upload
        $new_filename = uniqid();
        $file->setName( $new_filename );

        // Validate file upload
        // MimeType List => http://www.iana.org/assignments/media-types/media-types.xhtml
        $file->addValidations( array(
            // Ensure file is of type "image/png"
            // new \Upload\Validation\Mimetype( 'image/png'),

            //You can also add multi mimetype validation
            new \Upload\Validation\Mimetype( array( 'image/png', 'image/gif', 'image/jpeg' ) ),

            // Ensure file is no larger than 5M (use "B", "K", M", or "G")
            new \Upload\Validation\Size( '2M' )
        ) );

        // Access data about the file that has been uploaded
        $data = array(
            'name'       => $file->getNameWithExtension(),
            'extension'  => $file->getExtension(),
            'mime'       => $file->getMimetype(),
            'size'       => $file->getSize(),
            'md5'        => $file->getMd5(),
            'dimensions' => $file->getDimensions()
        );


        // Try to upload file
        try {
            // Success!
            $file->upload();

            //完整文件名
            $fullPath = $dir . '/' . $data['name'];
            //存入附件表
            //Attachment::save( [ 'file' => $fullPath, 'createtime' => time() ] );

            //返回文件名
            return $fullPath;

        } catch ( MazhenyuException $e ) {
            // Fail!
            throw new MazhenyuException( $file->getErrors()[0] );
        }
    }



}